#include "gpio.h"


void GPIO_Init(void){
    rcu_periph_clock_enable(RCU_GPIOA); 
    rcu_periph_clock_enable(RCU_GPIOB); 
    rcu_periph_clock_enable(RCU_GPIOC); 
    rcu_periph_clock_enable(RCU_GPIOD); 
    rcu_periph_clock_enable(RCU_SYSCFG);
    /* Test needed */
    gpio_mode_set(GPIOA,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLUP,GPIO_PIN_1);
    gpio_output_options_set(GPIOA,GPIO_OTYPE_PP,GPIO_OSPEED_25MHZ,GPIO_PIN_1);
    /* gpio_mode_set(GPIOC,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLUP,GPIO_PIN_15);
    gpio_output_options_set(GPIOC,GPIO_OTYPE_PP,GPIO_OSPEED_25MHZ,GPIO_PIN_15); */
    
    /* configure UART3 Tx as alternate function push-pull */
    gpio_af_set(GPIOA, GPIO_AF_8, GPIO_PIN_0);
    gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_0);
    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0);

    /* TMC6200 EN_GATE PB12 */
    gpio_bit_write(EN_GATE_GPIO_Port,EN_GATE_Pin,RESET);
    gpio_mode_set(EN_GATE_GPIO_Port,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,EN_GATE_Pin);
    gpio_output_options_set(EN_GATE_GPIO_Port,GPIO_OTYPE_PP,GPIO_OSPEED_2MHZ,EN_GATE_Pin);

    /* TMC6200 M0 CS PC13 */
    gpio_bit_write(M0_nCS_GPIO_Port,M0_nCS_Pin,SET);
    gpio_mode_set(M0_nCS_GPIO_Port,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,M0_nCS_Pin);
    gpio_output_options_set(M0_nCS_GPIO_Port,GPIO_OTYPE_PP,GPIO_OSPEED_2MHZ,M0_nCS_Pin);

    /* TMC6200 M1 CS PC14 */
    gpio_bit_write(M1_nCS_GPIO_Port,M1_nCS_Pin,SET);
    gpio_mode_set(M1_nCS_GPIO_Port,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,M1_nCS_Pin);
    gpio_output_options_set(M1_nCS_GPIO_Port,GPIO_OTYPE_PP,GPIO_OSPEED_2MHZ,M1_nCS_Pin);

    /* TMC6200 Fault PD2 */
    gpio_mode_set(nFAULT_GPIO_Port,GPIO_MODE_INPUT,GPIO_PUPD_NONE,nFAULT_Pin);

    /**SPI2 GPIO Configuration    
    PC10     ------> SPI2_SCK
    PC11     ------> SPI2_MISO
    PC12     ------> SPI2_MOSI **/
    gpio_mode_set(GPIOC,GPIO_MODE_AF,GPIO_PUPD_PULLUP,GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12);
    gpio_af_set(GPIOC,GPIO_AF_6,GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12);
    gpio_output_options_set(GPIOC,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12);


    /**ADC GPIO Configuration    
    PC0     ------> ADC_IN10
    PC1     ------> ADC_IN11
    PC2     ------> ADC_IN12
    PC3     ------> ADC_IN13 **/
    gpio_mode_set(M0_IB_GPIO_Port,GPIO_MODE_ANALOG,GPIO_PUPD_NONE,M0_IB_Pin);   //PC0
    gpio_mode_set(M0_IC_GPIO_Port,GPIO_MODE_ANALOG,GPIO_PUPD_NONE,M0_IC_Pin);   //PC1
    gpio_mode_set(M1_IB_GPIO_Port,GPIO_MODE_ANALOG,GPIO_PUPD_NONE,M1_IB_Pin);   //PC3
    gpio_mode_set(M1_IC_GPIO_Port,GPIO_MODE_ANALOG,GPIO_PUPD_NONE,M1_IC_Pin);   //PC2
     

    /* PA3 NTC              ADC1_IN3 */
    /* PA4 NTC              ADC1_IN4 */
    /* PA5 MOSFET TEMP      ADC1_IN5 */
    /* PA6 VBUS             ADC1_IN6 */
    gpio_mode_set(M0_MOTOR_TEMP_GPIO_Port,GPIO_MODE_ANALOG,GPIO_PUPD_NONE,M0_MOTOR_TEMP_Pin);  
    gpio_mode_set(M1_MOTOR_TEMP_GPIO_Port,GPIO_MODE_ANALOG,GPIO_PUPD_NONE,M1_MOTOR_TEMP_Pin);   
    gpio_mode_set(M1_TEMP_GPIO_Port,GPIO_MODE_ANALOG,GPIO_PUPD_NONE,M1_TEMP_Pin);   
    gpio_mode_set(VBUS_S_GPIO_Port,GPIO_MODE_ANALOG,GPIO_PUPD_NONE,VBUS_S_Pin);   


    /**M0_PWM GPIO Configuration    
    PA10    ------> M0_CH
    PA9     ------> M0_BH
    PA8     ------> M0_AH
    PB15    ------> M0_CL
    PB14    ------> M0_BL
    PB13    ------> M0_AL**/
    gpio_mode_set(GPIOA,GPIO_MODE_AF,GPIO_PUPD_NONE,GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10);
    gpio_af_set(GPIOA,GPIO_AF_1,GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10);
    gpio_output_options_set(GPIOA,GPIO_OTYPE_PP,GPIO_OSPEED_200MHZ,GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10);
    gpio_mode_set(GPIOB,GPIO_MODE_AF,GPIO_PUPD_NONE,GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15);
    gpio_af_set(GPIOB,GPIO_AF_1,GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15);
    gpio_output_options_set(GPIOB,GPIO_OTYPE_PP,GPIO_OSPEED_200MHZ,GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15);


    /**M1_PWM GPIO Configuration    
    PC8     ------> M1_CH
    PC7     ------> M1_BH
    PC6     ------> M1_AH
    PB1     ------> M1_CL
    PB0     ------> M1_BL
    PA7     ------> M1_AL**/
    gpio_mode_set(GPIOC,GPIO_MODE_AF,GPIO_PUPD_NONE,GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8);
    gpio_af_set(GPIOC,GPIO_AF_3,GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8);
    gpio_output_options_set(GPIOC,GPIO_OTYPE_PP,GPIO_OSPEED_200MHZ,GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8);
    gpio_mode_set(GPIOB,GPIO_MODE_AF,GPIO_PUPD_NONE,GPIO_PIN_0|GPIO_PIN_1);
    gpio_af_set(GPIOB,GPIO_AF_3,GPIO_PIN_0|GPIO_PIN_1);
    gpio_output_options_set(GPIOB,GPIO_OTYPE_PP,GPIO_OSPEED_200MHZ,GPIO_PIN_0|GPIO_PIN_1);
    gpio_mode_set(GPIOA,GPIO_MODE_AF,GPIO_PUPD_NONE,GPIO_PIN_7);
    gpio_af_set(GPIOA,GPIO_AF_3,GPIO_PIN_7);
    gpio_output_options_set(GPIOA,GPIO_OTYPE_PP,GPIO_OSPEED_200MHZ,GPIO_PIN_7);


    /**CAN0 GPIO Configuration
    PB8     ------> CAN0_RX
    PB9     ------> CAN0_TX**/
    gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_8);
    gpio_af_set(GPIOB, GPIO_AF_9, GPIO_PIN_8);
    gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_8);
    gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_9);
    gpio_af_set(GPIOB, GPIO_AF_9, GPIO_PIN_9);
    gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);


    /** Encoder GPIO Configuration
    PB4     ------> M0_Encoder_A
    PB5     ------> M0_Encoder_B
    PB6     ------> M1_Encoder_A
    PB7     ------> M1_Encoder_B   **/
    gpio_mode_set(M0_ENC_A_GPIO_Port, GPIO_MODE_AF, GPIO_PUPD_PULLUP, M0_ENC_A_Pin);
    gpio_af_set(M0_ENC_A_GPIO_Port, GPIO_AF_2, M0_ENC_A_Pin);
    gpio_mode_set(M0_ENC_B_GPIO_Port, GPIO_MODE_AF, GPIO_PUPD_PULLUP, M0_ENC_B_Pin);
    gpio_af_set(M0_ENC_B_GPIO_Port, GPIO_AF_2, M0_ENC_B_Pin);
    gpio_mode_set(M1_ENC_A_GPIO_Port, GPIO_MODE_AF, GPIO_PUPD_PULLUP, M1_ENC_A_Pin);
    gpio_af_set(M1_ENC_A_GPIO_Port, GPIO_AF_2, M1_ENC_A_Pin);
    gpio_mode_set(M1_ENC_B_GPIO_Port, GPIO_MODE_AF, GPIO_PUPD_PULLUP, M1_ENC_B_Pin);
    gpio_af_set(M1_ENC_B_GPIO_Port, GPIO_AF_2, M1_ENC_B_Pin);


    /** USB GPIO Configuration
     *  PA11     ------> USB_OTG_FS_DM
     *  PA12     ------> USB_OTG_FS_DP 
     * */
    gpio_mode_set(GPIOA,GPIO_MODE_AF,GPIO_PUPD_NONE,GPIO_PIN_11|GPIO_PIN_12);
    gpio_output_options_set(GPIOA,GPIO_OTYPE_PP,GPIO_OSPEED_200MHZ,GPIO_PIN_11|GPIO_PIN_12);
    gpio_af_set(GPIOA,GPIO_AF_10,GPIO_PIN_11|GPIO_PIN_12);

    /** PWM GPIO Capture
     *  PA0     ------> M1 Capture TIM4_CH0
     *  PA2     ------> M0 Capture TIM8_CH0
     * */
    /* gpio_mode_set(GPIOA,GPIO_MODE_AF,GPIO_PUPD_PULLUP,GPIO_PIN_0);
    gpio_af_set(GPIOA,GPIO_AF_2,GPIO_PIN_0); */
    gpio_mode_set(GPIOA,GPIO_MODE_AF,GPIO_PUPD_PULLUP,GPIO_PIN_2);
    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_2);
    gpio_af_set(GPIOA,GPIO_AF_3,GPIO_PIN_2);
}